package start.spring.basic.report.service.filltemplete.impl;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

import start.spring.basic.constant.CommonConstant;
import start.spring.basic.page.PageQuery;
import start.spring.basic.page.PageResult;
import start.spring.basic.report.dao.ReportFillDataMapper;
import start.spring.basic.report.entity.ReportFillData;
import start.spring.basic.report.entity.ReportTempleteDesign;
import start.spring.basic.report.enums.FillStatus;
import start.spring.basic.report.enums.ReleaseFlag;
import start.spring.basic.report.service.BaseServiceImpl;
import start.spring.basic.report.service.filltemplete.IReportFillDataService;
import start.spring.basic.report.service.filltemplete.IReportTempleteDesignService;
import start.spring.basic.report.vo.filltemplete.FillDataInfo;
import start.spring.basic.response.ResponseData;
import start.spring.basic.util.common.StringUtil;

/**
 * 填报数据Service业务层处理
 * 
 * @author xyy
 * @date 2024-01-16
 */
@Service
public class ReportFillDataServiceImpl extends BaseServiceImpl implements IReportFillDataService {
    
    @Autowired
    private ReportFillDataMapper reportFillDataMapper;
    
    @Autowired
    private IReportTempleteDesignService reportTempleteDesignService;
    
    @Override
    public PageResult<ReportFillData> selectReportFillDataPageList(PageQuery pageQuery,ReportFillData reportFillData) {
        IPage<ReportFillData> page = super.getPage(pageQuery);
        QueryWrapper<ReportFillData> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(reportFillData.getFilldataId()!=null, ReportFillData::getFilldataId, reportFillData.getFilldataId());
        queryWrapper.lambda().like(!StringUtil.isEmpty(reportFillData.getTempleteName()), ReportFillData::getTempleteName, reportFillData.getTempleteName());
    	queryWrapper.lambda().eq(!StringUtil.isEmpty(reportFillData.getFillStatus()), ReportFillData::getFillStatus, reportFillData.getFillStatus());
        if(!StringUtil.isEmpty(reportFillData.getBeginCreateTime()) && !StringUtil.isEmpty(reportFillData.getEndCreateTime())) {
        	queryWrapper.lambda().between(ReportFillData::getCreateTime, reportFillData.getBeginCreateTime() + CommonConstant.SURFIX_DATE_BEGIN, reportFillData.getEndCreateTime() + CommonConstant.SURFIX_DATE_END);
        }
        queryWrapper.lambda().orderByDesc(ReportFillData::getUpdateTime);
        page = this.reportFillDataMapper.selectPage(page, queryWrapper);
        return super.getPageResult(page);
    }
    
    @Override
    public List<ReportFillData> selectReportFillDataList(ReportFillData reportFillData) {
        QueryWrapper<ReportFillData> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(reportFillData.getFilldataId()!=null, ReportFillData::getFilldataId, reportFillData.getFilldataId());
        queryWrapper.lambda().like(!StringUtil.isEmpty(reportFillData.getTempleteName()), ReportFillData::getTempleteName, reportFillData.getTempleteName());
    	queryWrapper.lambda().eq(!StringUtil.isEmpty(reportFillData.getFillStatus()), ReportFillData::getFillStatus, reportFillData.getFillStatus());
        if(!StringUtil.isEmpty(reportFillData.getBeginCreateTime()) && !StringUtil.isEmpty(reportFillData.getEndCreateTime())) {
        	queryWrapper.lambda().between(ReportFillData::getCreateTime, reportFillData.getBeginCreateTime() + CommonConstant.SURFIX_DATE_BEGIN, reportFillData.getEndCreateTime() + CommonConstant.SURFIX_DATE_END);
        }
        return this.reportFillDataMapper.selectList(queryWrapper);
    }
    
    public int insertReportFillData(ReportFillData reportFillData) {
        return this.reportFillDataMapper.insert(reportFillData);
    }
    
    @Override
    public int updateReportFillData(ReportFillData reportFillData) {
    	UpdateWrapper<ReportFillData> updateWrapper = new UpdateWrapper<>();
    	updateWrapper.lambda().eq(ReportFillData::getFilldataId, reportFillData.getFilldataId());
    	updateWrapper.lambda().eq(ReportFillData::getUserId, super.getSysUser().getUserId());
        return this.reportFillDataMapper.update(reportFillData, updateWrapper);
    }
    
    @Override
    public ResponseData<String> deleteReportFillDataByDataIds(List<Long> dataIds) {
        this.reportFillDataMapper.deleteBatchIds(dataIds);
        return ResponseData.successMsg("已删除!");
    }
    
	@Override
	public ResponseData<String> saveDraft(ReportFillData reportFillData) {
		return this.fillData(reportFillData, FillStatus.DRAFT.getStatus());
	}
	
	@Override
	@Transactional
	public ResponseData<String> commitData(ReportFillData reportFillData) {
		return this.fillData(reportFillData, FillStatus.COMPLETE.getStatus());
	}
	
	private ResponseData<String> fillData(ReportFillData reportFillData,String fillStatus){
		if(reportFillData==null)  {
			return ResponseData.errorMsg("提交数据不可为空！");
		}else {
			Long templeteId = reportFillData.getTempleteId();
			if(templeteId==null||templeteId==0) {
				return ResponseData.errorMsg("请指定填报模板！");
			}else {
				ReportTempleteDesign templeteDesign = this.queryReportTemplete(templeteId);
				if(templeteDesign==null) {
					return ResponseData.errorMsg("您选择的填报模板不存在！");
				}else {
					String releaseFlag = templeteDesign.getReleaseFlag();
					if(!ReleaseFlag.RELEASED.getFlag().equals(releaseFlag)) {
						return ResponseData.errorMsg("您选择的填报模板已取消发布，当前不可填报！");
					}else {
						Long filldataId = reportFillData.getFilldataId();
						if(filldataId!=null) {
							//更新现有数据
							ReportFillData fillData = new ReportFillData();
							fillData.setFilldataId(filldataId);
							List<ReportFillData> fillDataList = selectReportFillDataList(fillData);
							if(fillDataList!=null&&fillDataList.size()>0) {
								ReportFillData fillDataDb = fillDataList.get(0);
								if(FillStatus.COMPLETE.getStatus().equals(fillDataDb.getFillStatus())) {
									return ResponseData.errorMsg("数据已提交，不可修改！");
								}else {
									if(super.getSysUser().getUserId()!=fillDataDb.getUserId()) {
										return ResponseData.errorMsg("您无权修改他人填报数据！");
									}else {
										fillData.setFillContent(reportFillData.getFillContent());
										fillData.setFillStatus(fillStatus);
										fillData.setUpdateTime(new Date());
										updateReportFillData(fillData);
									}
								}
							}else {
								return ResponseData.errorMsg("您要更新的数据不存在！");
							}
						}else {
							//新填报数据
							reportFillData.setFilldataId(super.idGenerator.nextNumberId());
							reportFillData.setTempleteName(templeteDesign.getTempleteName());
							reportFillData.setUserId(super.getSysUser().getUserId());
							reportFillData.setUserName(super.getSysUser().getUserName());
							reportFillData.setNickName(super.getSysUser().getNickName());
							reportFillData.setFillStatus(fillStatus);
							reportFillData.setCreateTime(new Date());
							reportFillData.setUpdateTime(new Date());
							this.reportFillDataMapper.insert(reportFillData);
						}
						
						if(FillStatus.COMPLETE.getStatus().equals(fillStatus)) {
							//TODO 补充根据数据库映射关系，解析填报数据到并保存明细表
							
						}
					}
				}
			}
		}
		return ResponseData.successData(String.valueOf(reportFillData.getFilldataId()));
	}

	@Override
	public ResponseData<FillDataInfo> selectReportFillDataDetail(ReportFillData reportFillData) {
		
		if(reportFillData==null) {
			return ResponseData.errorMsg("请指定需要查询的数据！");
		}else {
			FillDataInfo fillDataInfo = new FillDataInfo();
			Long templeteId = reportFillData.getTempleteId();
			if(templeteId==null||templeteId==0) {
				return ResponseData.errorMsg("请指定需要查询的填报模板！");
			}else {
				ReportTempleteDesign templeteDesign = this.queryReportTemplete(templeteId);
				if(templeteDesign==null) {
					return ResponseData.errorMsg("您要查询的填报模板不存在！");
				}else {
					fillDataInfo.setTempleteCellrelation(templeteDesign.getTempleteCellrelation());
					fillDataInfo.setTempleteProtect(templeteDesign.getTempleteProtect());
					
					Long filldataId = reportFillData.getFilldataId();
					if(filldataId!=null) {
						ReportFillData fillData = new ReportFillData();
						fillData.setFilldataId(filldataId);
						List<ReportFillData> fillDataList = selectReportFillDataList(fillData);
						if(fillDataList!=null&&fillDataList.size()>0) {
							ReportFillData fillDataDb = fillDataList.get(0);
							//此处仅做了基础权限控制，可以根据实际业务进行优化完善
							if(!super.getSysUser().isAdmin()&&super.getSysUser().getUserId()!=fillDataDb.getUserId()) {
								return ResponseData.errorMsg("您无权获取他人填报数据！");
							}else {
								fillDataInfo.setFillContent(fillDataDb.getFillContent());
							}
						}else {
							return ResponseData.errorMsg("您查询的数据不存在！");
						}
					}
				}
			}
			return ResponseData.successData(fillDataInfo);
		}
	}
	
	private ReportTempleteDesign queryReportTemplete(Long templeteId){
		if(templeteId==null) {
			return null;
		}else {
			ReportTempleteDesign reportTempleteDesign = new ReportTempleteDesign();
			reportTempleteDesign.setTempleteId(templeteId);
			List<ReportTempleteDesign> templeteDesignList = reportTempleteDesignService.selectReportTempleteDesignList(reportTempleteDesign);
			if(templeteDesignList!=null&&templeteDesignList.size()>0) {
				return templeteDesignList.get(0);
			}else {
				return null;
			}
		}
	}
}
